package com.spider.site.web.processor;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.spider.site.entity.SpiderResult;
import com.spider.site.pojo.util.SpiderUtil;
import com.spider.site.service.SpiderService;

import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.Html;

/**
 * 战旗 定制
 * 
 * @author wq
 */
@Component
public class SpiderZQProcessor implements PageProcessor {

	@Autowired
	private SpiderService spiderService;

	@Autowired
	private SpiderUtil spiderUtil;

	private Site site = Site.me().setRetryTimes(3).setSleepTime(200);// 基础配置

	@Override
	public void process(Page page) {
		String url = page.getRequest().getUrl();
		SpiderResult spiderResult = this.spiderService.getByURL(url);
		if (spiderResult != null) {
			WebDriver webDriver = new InternetExplorerDriver();
			webDriver.get(url);
			while (spiderResult.getIsSpin() == 1) {
				try {
					/* 2.线程睡眠 ，以让页面渲染完整 */
					Thread.sleep(30 * 1000);// 睡眠 30s
					/* 3.解析页面元素 （核心） */
					WebElement webElement = webDriver.findElement(By.xpath("/html"));
					Html html = new Html(webElement.getAttribute("outerHTML"));// 获取到 html对象
					String name = spiderResult.getName(), // 直播间名称
							author = spiderResult.getAuthor(), // 主播
							image = spiderResult.getImage();// 头像
					if (!spiderUtil.isNullOrEmpty(name, author, image)) {// 极小变化的抓取值，不需要每次都要解析
						name = html.xpath("//*[@id=\"js-room-anchor-info-area\"]/div[2]/div[1]/p/text()").get();// 直播间名称
						author = html.xpath("//*[@id=\"js-anchor-nickname-card-area\"]/text()").get();// 主播名
						image = html.xpath("//*[@id=\"js-room-anchor-info-area\"]/div[1]/img/@src").get();// 头像
					}
					String number = html.xpath("//*[@id=\"js-room-online-panel\"]/span/span/text()").get();// 热度
					// String time =
					// html.xpath("//*[@class=\"time-v-con\"]/a/text()").get();//上次直播的时间，假如获取到这个值证明该主播已经下播
					List<String> userNames = html
							.xpath("//*[@id=\"js-right-chat-panel\"]/div[1]/div[4]/div[2]/ul/li/a/span/text()")
							.all().stream().filter(n -> !n.equals("")).collect(Collectors.toList());// 用户名
					List<String> comments = html
							.xpath("//*[@id=\"js-right-chat-panel\"]/div[1]/div[4]/div[2]/ul/li/span/text()").all()
							.stream().filter(c -> !spiderUtil.filterWord(c) && !c.equals(""))
							.collect(Collectors.toList());// 评论
					spiderUtil.savaSpiderData(number, name, this.mergeList(userNames, comments), author, spiderResult,
							image, url, null);// 保存数据（持久化）
					/* 4.正常爬取数据成功后的处理 */
					spiderResult = spiderService.getByURL(url);// 更新一下对象的状态
					spiderUtil.updateSpinStatus(spiderResult, 1);
				} catch (Exception e) {
					e.printStackTrace();
					spiderUtil.exceptionCommon(e, url);//异常处理
					break;// 跳出循环
				}
			}
			spiderUtil.updateSpinStatus(spiderResult, 0);
			webDriver.quit();// 离开
		}
	}

	/**
	 * 战旗 评论合成
	 * 
	 * @param list
	 * @return
	 */
	public List<String> mergeList(List<String> name, List<String> comment) {
		List<String> list = new ArrayList<>();
		if (name != null && comment != null && name.size() > 0 && comment.size() > 0) {
			for (int i = 0; i < name.size(); i++) {
				if (comment.get(i).contains("给主播送出")) {
					list.add(name.get(i) + comment.get(i) + "了礼物");
				} else {
					list.add(name.get(i) + comment.get(i));
				}
			}
		}
		return list;
	}

	@Override
	public Site getSite() {
		return site;
	}

}
